/*
 *  Copyright 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc;

import androidx.annotation.Nullable;

import java.util.Arrays;

import org.webrtc.PeerConnection;

/**
 * Representation of a single ICE Candidate, mirroring
 * {@code IceCandidateInterface} in the C++ API.
 */
public class IceCandidate {
    public final String sdpMid;
    public final int sdpMLineIndex;
    public final String sdp;
    public final String serverUrl;
    public final PeerConnection.AdapterType adapterType;

    public IceCandidate(String sdpMid, int sdpMLineIndex, String sdp) {
        this.sdpMid = sdpMid;
        this.sdpMLineIndex = sdpMLineIndex;
        this.sdp = sdp;
        this.serverUrl = "";
        this.adapterType = PeerConnection.AdapterType.UNKNOWN;
    }

    @CalledByNative
    IceCandidate(String sdpMid, int sdpMLineIndex, String sdp, String serverUrl,
                 PeerConnection.AdapterType adapterType) {
        this.sdpMid = sdpMid;
        this.sdpMLineIndex = sdpMLineIndex;
        this.sdp = sdp;
        this.serverUrl = serverUrl;
        this.adapterType = adapterType;
    }

    @Override
    public String toString() {
        return sdpMid + ":" + sdpMLineIndex + ":" + sdp + ":" + serverUrl + ":"
                + adapterType.toString();
    }

    @CalledByNative
    String getSdpMid() {
        return sdpMid;
    }

    @CalledByNative
    String getSdp() {
        return sdp;
    }

    /**
     * equals() checks sdpMid, sdpMLineIndex, and sdp for equality.
     */
    @Override
    public boolean equals(@Nullable Object object) {
        if (!(object instanceof IceCandidate)) {
            return false;
        }

        IceCandidate that = (IceCandidate) object;
        return objectEquals(this.sdpMid, that.sdpMid) && this.sdpMLineIndex == that.sdpMLineIndex
                && objectEquals(this.sdp, that.sdp);
    }

    @Override
    public int hashCode() {
        Object[] values = {sdpMid, sdpMLineIndex, sdp};
        return Arrays.hashCode(values);
    }

    private static boolean objectEquals(Object o1, Object o2) {
        if (o1 == null) {
            return o2 == null;
        }
        return o1.equals(o2);
    }
}
